88fcea
@@ -77,14 +77,12 @@
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rex.RexBuilder;
-import org.apache.calcite.rex.RexExecutorImpl;
 import org.apache.calcite.rex.RexFieldCollation;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.rex.RexWindowBound;
 import org.apache.calcite.schema.SchemaPlus;
-import org.apache.calcite.schema.Schemas;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.sql.SqlCall;
 import org.apache.calcite.sql.SqlExplainLevel;
@@ -1367,24 +1365,11 @@
private RelNode genUnionLogicalPlan(String unionalias, String leftalias, RelNode
 
     private RelNode genJoinRelNode(RelNode leftRel, RelNode rightRel, JoinType hiveJoinType,
         ASTNode joinCond) throws SemanticException {
-      RelNode joinRel = null;
 
-      // 1. construct the RowResolver for the new Join Node by combining row
-      // resolvers from left, right
       RowResolver leftRR = this.relToHiveRR.get(leftRel);
       RowResolver rightRR = this.relToHiveRR.get(rightRel);
-      RowResolver joinRR = null;
 
-      if (hiveJoinType != JoinType.LEFTSEMI) {
-        joinRR = RowResolver.getCombinedRR(leftRR, rightRR);
-      } else {
-        joinRR = new RowResolver();
-        if (!RowResolver.add(joinRR, leftRR)) {
-          LOG.warn("Duplicates detected when adding columns to RR: see previous message");
-        }
-      }
-
-      // 2. Construct ExpressionNodeDesc representing Join Condition
+      // 1. Construct ExpressionNodeDesc representing Join Condition
       RexNode calciteJoinCond = null;
       if (joinCond != null) {
         JoinTypeCheckCtx jCtx = new JoinTypeCheckCtx(leftRR, rightRR, hiveJoinType);
@@ -1405,12 +1390,12 @@
private RelNode genJoinRelNode(RelNode leftRel, RelNode rightRel, JoinType hiveJ
         calciteJoinCond = cluster.getRexBuilder().makeLiteral(true);
       }
 
-      // 3. Validate that join condition is legal (i.e no function refering to
+      // 2. Validate that join condition is legal (i.e no function refering to
       // both sides of join, only equi join)
       // TODO: Join filter handling (only supported for OJ by runtime or is it
       // supported for IJ as well)
 
-      // 4. Construct Join Rel Node
+      // 3. Construct Join Rel Node and RowResolver for the new Join Node
       boolean leftSemiJoin = false;
       JoinRelType calciteJoinType;
       switch (hiveJoinType) {
@@ -1433,6 +1418,8 @@
private RelNode genJoinRelNode(RelNode leftRel, RelNode rightRel, JoinType hiveJ
         break;
       }
 
+      RelNode topRel = null;
+      RowResolver topRR = null;
       if (leftSemiJoin) {
         List<RelDataTypeField> sysFieldList = new ArrayList<RelDataTypeField>();
         List<RexNode> leftJoinKeys = new ArrayList<RexNode>();
@@ -1452,19 +1439,60 @@
private RelNode genJoinRelNode(RelNode leftRel, RelNode rightRel, JoinType hiveJ
         calciteJoinCond = HiveCalciteUtil.projectNonColumnEquiConditions(
             HiveRelFactories.HIVE_PROJECT_FACTORY, inputRels, leftJoinKeys, rightJoinKeys, 0,
             leftKeys, rightKeys);
-
-        joinRel = HiveSemiJoin.getSemiJoin(cluster, cluster.traitSetOf(HiveRelNode.CONVENTION),
+        topRel = HiveSemiJoin.getSemiJoin(cluster, cluster.traitSetOf(HiveRelNode.CONVENTION),
             inputRels[0], inputRels[1], calciteJoinCond, ImmutableIntList.copyOf(leftKeys),
             ImmutableIntList.copyOf(rightKeys));
+
+        // Create join RR: we need to check whether we need to update left RR in case
+        // previous call to projectNonColumnEquiConditions updated it
+        if (inputRels[0] != leftRel) {
+          RowResolver newLeftRR = new RowResolver();
+          if (!RowResolver.add(newLeftRR, leftRR)) {
+            LOG.warn("Duplicates detected when adding columns to RR: see previous message");
+          }
+          for (int i = leftRel.getRowType().getFieldCount();
+                  i < inputRels[0].getRowType().getFieldCount(); i++) {
+            ColumnInfo oColInfo = new ColumnInfo(
+                SemanticAnalyzer.getColumnInternalName(i),
+                TypeConverter.convert(inputRels[0].getRowType().getFieldList().get(i).getType()),
+                null, false);
+            newLeftRR.put(oColInfo.getTabAlias(), oColInfo.getInternalName(), oColInfo);
+          }
+
+          RowResolver joinRR = new RowResolver();
+          if (!RowResolver.add(joinRR, newLeftRR)) {
+            LOG.warn("Duplicates detected when adding columns to RR: see previous message");
+          }
+          relToHiveColNameCalcitePosMap.put(topRel, this.buildHiveToCalciteColumnMap(joinRR, topRel));
+          relToHiveRR.put(topRel, joinRR);
+
+          // Introduce top project operator to remove additional column(s) that have
+          // been introduced
+          List<RexNode> topFields = new ArrayList<RexNode>();
+          List<String> topFieldNames = new ArrayList<String>();
+          for (int i = 0; i < leftRel.getRowType().getFieldCount(); i++) {
+            final RelDataTypeField field = leftRel.getRowType().getFieldList().get(i);
+            topFields.add(leftRel.getCluster().getRexBuilder().makeInputRef(field.getType(), i));
+            topFieldNames.add(field.getName());
+          }
+          topRel = HiveRelFactories.HIVE_PROJECT_FACTORY.createProject(topRel, topFields, topFieldNames);
+        }
+
+        topRR = new RowResolver();
+        if (!RowResolver.add(topRR, leftRR)) {
+          LOG.warn("Duplicates detected when adding columns to RR: see previous message");
+        }
       } else {
-        joinRel = HiveJoin.getJoin(cluster, leftRel, rightRel, calciteJoinCond, calciteJoinType,
+        topRel = HiveJoin.getJoin(cluster, leftRel, rightRel, calciteJoinCond, calciteJoinType,
             leftSemiJoin);
+        topRR = RowResolver.getCombinedRR(leftRR, rightRR);
       }
-      // 5. Add new JoinRel & its RR to the maps
-      relToHiveColNameCalcitePosMap.put(joinRel, this.buildHiveToCalciteColumnMap(joinRR, joinRel));
-      relToHiveRR.put(joinRel, joinRR);
 
-      return joinRel;
+      // 4. Add new rel & its RR to the maps
+      relToHiveColNameCalcitePosMap.put(topRel, this.buildHiveToCalciteColumnMap(topRR, topRel));
+      relToHiveRR.put(topRel, topRR);
+
+      return topRel;
     }
 
     /**
